<?php

class Listas_Model_DetalleLista extends Model_Cna {
	
	private $seccionesTable;
	private $elementosTable;
	
	public function __construct() {
		parent::__construct();
		$this->seccionesTable = new Listas_Model_DbTable_Secciones();
		$this->elementosTable = new Listas_Model_DbTable_ElementosLista();
	}
	
	public function getSecciones($codlista) {
		$registros = $this->seccionesTable->getSecciones($codlista);
	    for($i=0, $total = count($registros); $i < $total; $i++) {
		    $registros[$i]["elementos"] = $this->elementosTable->getElementosAsignados($registros[$i]["codseccionlista"]);
			
		}
//		Zend_Debug::dump($registros);
		return $registros;
	}
	
    public function getSeccion($codseccionlista) {
		return $this->seccionesTable->find($codseccionlista)->current()->toArray();
	}
	
	/**
	 * Elimina una seccion de la lista
	 * @param integer $codseccionlista
	 */
    public function eliminarSeccion($codseccionlista) {
		$row = $this->seccionesTable->find($codseccionlista)->current();
		$codlista = $row->codlista;
		$row->delete();
		$this->seccionesTable->resetOrden($codlista);
	}
	
	/**
	 * Guardar los datos de una seccion para una lista
	 * @param array $datos
	 * @return integer la llave primaria de la sección creada o modificada
	 */
	public function guardarSeccion(array $datos) {
	    if(!empty($datos["codseccionlista"])) {
			return $this->seccionesTable->find($datos["codseccionlista"])->current()->setFromArray($datos)->save();
		} else {
		    unset($datos["codseccionlista"]);
		    $orden = $this->seccionesTable->nextOrden($datos["codlista"]);
		    $row = $this->seccionesTable->createRow();
		    $row->setFromArray($datos);
		    $row->orden = $orden;
			return $row->save();
		}
	}
	
	/**
	 * Guardar los datos de un elemento/pregunta para una sección de lista en el banco de preguntas
	 * @param array $datos
	 * @return integer la llave primaria de la pregunta creada o modificada
	 */
	public function guardarElementoBanco(array $datos) {
	    $datos = $this->forceEmptyAsNull($datos);
	    if(!empty($datos["codelementolista"])) {
			return $this->elementosTable->find($datos["codelementolista"])->current()->setFromArray($datos)->save();
		} else {
		    unset($datos["codelementolista"]);
		    return $this->elementosTable->createRow($datos)->save();
		}
	}
	
	/**
	 * Obtiene todos los elementos del banco que pertenezcan a un tipo
	 * de lista especifico, y que no se encuentren asignados previamente a una lista
	 * @param string $tipolista el tipo de la lista de la que se desean obtener los elementos
	 * @param integer $codlista código de la lista para filtrar los elementos que se obtienen
	 * @return array
	 */
	public function getElementosBanco($tipolista, $codlista, $codinstitucion=NULL) {
		$registros = $this->elementosTable->getElementos($tipolista, $codlista, $codinstitucion);
		$listasTable = new Listas_Model_DbTable_Listas();
		for($i=0, $total = count($registros); $i < $total; $i++) {
		    $registros[$i]["listas"] = $listasTable->getListasAsignadasElemento($registros[$i]["codelementolista"]);
			
		}
//		Zend_Debug::dump($registros);
		return $registros;
	}
	
	/**
	 * Obtiene todos los elementos asignados a una seccion
	 * @param integer $codseccionlista código de la seccion para filtrar los elementos que se obtienen
	 * @param boolean $withListasAsignadas indica si se deben incluir en los resultados las listas a las que se encuentra
	 * 										asignado cada elemento
	 * @return array
	 */
	public function getElementosAsignados($codseccionlista, $withListasAsignadas=true) {
		$registros = $this->elementosTable->getElementosAsignados($codseccionlista);
//		if($withListasAsignadas) {
//    		$listasTable = new Listas_Model_DbTable_Listas();
//    		for($i=0, $total = count($registros); $i < $total; $i++) {
//    		    $registros[$i]["listas"] = $listasTable->getListasAsignadasElemento($registros[$i]["codelementolista"]);
//
//    		}
//		}
		//Zend_Debug::dump($registros);
		return $registros;
	}
	
	public function getElemento($codelementolista) {
		return $this->elementosTable->find($codelementolista)->current()->toArray();
	}
	
    public function eliminarElemento($codelementolista) {
		return $this->elementosTable->find($codelementolista)->current()->delete();
	}
	
    public function asignarElementoSeccion($codelementolista, $codseccion) {
        $this->elementosTable->asignarElementoSeccion($codelementolista, $codseccion);
		//return $this->elementosTable->find($codelementolista)->current()->delete();
	}
	
	/**
	 * Asignar un conjunto de elementos/preguntas a una sección de una lista
	 * @param array $elementos códigos de los elementos a asignar
	 * @param integer $codseccion código de la sección a la que se deben asignar los elementos
	 */
	public function asignarArrayElementoSeccion(array $elementos, $codseccion) {
		$this->elementosTable->getAdapter()->beginTransaction();
		try {
			foreach ($elementos as $codelementolista) {
				$this->elementosTable->asignarElementoSeccion($codelementolista, $codseccion);
			}
		    $this->elementosTable->getAdapter()->commit();
		} catch (Exception $e) {
		    $this->elementosTable->getAdapter()->rollBack();
		    throw $e;
		}
	}
	
	/**
	 * Remover un conjunto de elementos/preguntas de una sección de una lista
	 * @param array $elementos códigos de los elementos a remover
	 * @param integer $codseccion código de la sección de la que se deben remover los elementos
	 */
	public function removerArrayElementoSeccion(array $elementos, $codseccion) {
		$this->elementosTable->getAdapter()->beginTransaction();
		try {
			foreach ($elementos as $codelementolista) {
				$this->elementosTable->removerElementoSeccion($codelementolista, $codseccion);
			}
			$this->elementosTable->resetOrden($codseccion);
		    $this->elementosTable->getAdapter()->commit();
		} catch (Exception $e) {
		    $this->elementosTable->getAdapter()->rollBack();
		    throw $e;
		}
	}
	
	
}//fin de la clase